package dlg.code.singleton;

public class DoubleCheckSingleton {

    private volatile static DoubleCheckSingleton instance;//volatile 防止[1] 处初始化后其他线程无法感知，导致多次初始化

    private DoubleCheckSingleton(){}

    public DoubleCheckSingleton getInstance(){
        if(null == instance){// 多线程时减少锁的获取次数
            synchronized (DoubleCheckSingleton.class){// 防止多线程初始化多次
                if(null == instance){
                    /*
                    19 new #3 <dlg/code/singleton/DoubleCheckSingleton>
                    22 dup
                    23 invokespecial #4 <dlg/code/singleton/DoubleCheckSingleton.<init>>
                    26 putstatic #2 <dlg/code/singleton/DoubleCheckSingleton.instance>

                    23和26行可能出现指令重排，导致this指针逃逸，导致其他线程拿到未初始化的对象

                     */
                    instance = new DoubleCheckSingleton();// [1] 可能存在指令重排，因此需要volatile 关键字修饰，防止指令重排
                    return instance;
                }
            }
        }
        return instance;
    }

    public static void main(String[] args) {

    }
}
